function baseConverter(number, ob, nb) {
    number = number + "";
    number = number.toUpperCase();
    var list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var dec = 0;
    for (var i = 0; i <= number.length; i++) {
        dec += (list.indexOf(number.charAt(i))) * (Math.pow(ob, (number.length - i - 1)));
    }
    number = "";
    var magnitude = Math.floor((Math.log(dec)) / (Math.log(nb)));
    for (var i = magnitude; i >= 0; i--) {
        var amount = Math.floor(dec / Math.pow(nb, i));
        number = number + list.charAt(amount);
        dec -= amount * (Math.pow(nb, i));
    }
    if (number.length == 0)number = 0;
    return number;
}

// Converts a RGB color to HSV
function toHSV(rgbColor) {
    rgbColor = rgbColor.replace('#', '');

    red = baseConverter(rgbColor.substr(0, 2), 16, 10);
    green = baseConverter(rgbColor.substr(2, 2), 16, 10);
    blue = baseConverter(rgbColor.substr(4, 2), 16, 10);
    if (red.length == 0)red = 0;
    if (green.length == 0)green = 0;
    if (blue.length == 0)blue = 0;
    red = red / 255;
    green = green / 255;
    blue = blue / 255;

    maxValue = Math.max(red, green, blue);
    minValue = Math.min(red, green, blue);

    var hue = 0;

    if (maxValue == minValue) {
        hue = 0;
        saturation = 0;
    } else {
        if (red == maxValue) {
            hue = (green - blue) / (maxValue - minValue) / 1;
        } else if (green == maxValue) {
            hue = 2 + (blue - red) / 1 / (maxValue - minValue) / 1;
        } else if (blue == maxValue) {
            hue = 4 + (red - green) / (maxValue - minValue) / 1;
        }
        saturation = (maxValue - minValue) / maxValue;
    }
    hue = hue * 60;
    valueBrightness = maxValue;

    if (valueBrightness / 1 < 0.5) {
        //saturation = (maxValue - minValue) / (maxValue + minValue);
    }
    if (valueBrightness / 1 >= 0.5) {
        //saturation = (maxValue - minValue) / (2 - maxValue - minValue);
    }


    returnArray = [hue, saturation, valueBrightness];
    return returnArray;
}

function toRgb(hue, saturation, valueBrightness) {
    Hi = Math.floor(hue / 60);
    if (hue == 360)Hi = 0;
    f = hue / 60 - Hi;
    p = (valueBrightness * (1 - saturation)).toPrecision(2);
    q = (valueBrightness * (1 - (f * saturation))).toPrecision(2);
    t = (valueBrightness * (1 - ((1 - f) * saturation))).toPrecision(2);

    switch (Hi) {
        case 0:
            red = valueBrightness;
            green = t;
            blue = p;
            break;
        case 1:
            red = q;
            green = valueBrightness;
            blue = p;
            break;
        case 2:
            red = q;
            green = valueBrightness;
            blue = t;
            break;
        case 3:
            red = p;
            green = q;
            ;
            blue = valueBrightness;
            break;
        case 4:
            red = t;
            green = p;
            blue = valueBrightness;
            break;
        case 5:
            red = valueBrightness;
            green = p;
            blue = q;
            break;
    }

    if (saturation == 0) {
        red = valueBrightness;
        green = valueBrightness;
        blue = valueBrightness;
    }

    red *= 255;
    green *= 255;
    blue *= 255;

    red = Math.round(red);
    green = Math.round(green);
    blue = Math.round(blue);

    red = baseConverter(red, 10, 16);
    green = baseConverter(green, 10, 16);
    blue = baseConverter(blue, 10, 16);

    red = red + "";
    green = green + "";
    blue = blue + "";

    while (red.length < 2) {
        red = "0" + red;
    }
    while (green.length < 2) {
        green = "0" + green;
    }
    while (blue.length < 2) {
        blue = "0" + "" + blue;
    }
    rgbColor = "#" + red + "" + green + "" + blue;
    return rgbColor.toUpperCase();
}

function findColorByDegrees(rgbColor, degrees) {
    rgbColor = rgbColor.replace('#', '');
    myArray = toHSV(rgbColor);
    myArray[0] += degrees;
    if (myArray[0] >= 360)myArray[0] -= 360;
    if (myArray[0] < 0)myArray[0] += 360;
    return toRgb(myArray[0], myArray[1], myArray[2]);
}

function findColorByBrightness(rgbColor, brightness) {

    rgbColor = rgbColor.replace('#', '');
    myArray = toHSV(rgbColor);

    myArray[2] += brightness / 100;
    if (myArray[2] > 1)myArray[2] = 1;
    if (myArray[2] < 0)myArray[2] = 0;

    myArray[1] += brightness / 100;
    if (myArray[1] > 1)myArray[1] = 1;
    if (myArray[1] < 0)myArray[1] = 0;

    return toRgb(myArray[0], myArray[1], myArray[2]);

}
